package net.sunofbeach.blog.controller.portal;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import net.sunofbeach.blog.pojo.Article;
import net.sunofbeach.blog.pojo.query.ArticleQuery;
import net.sunofbeach.blog.response.Result;
import net.sunofbeach.blog.service.ArticleService;
import net.sunofbeach.blog.utils.Constants;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * <p>
 * 文章前端控制器
 * </p>
 *
 * @author Bing
 * @since 2021-11-24
 */
@Api(tags = "门户文章管理")
@RestController
@RequestMapping("/portal/article")
public class ArticlePortalApi {

    @Resource
    private ArticleService articleService;


    /**
     * 获取详情
     * 权限：任意用户
     * 内容过滤：只允许获取置顶的，或者已经发布的文章
     * 其他获取：草稿，只能对应用户获取。已经删除的，只有管理员可以获取。
     *
     * @param articleId
     * @return
     */
    @ApiOperation("获取文章详情")
    @GetMapping("/{articleId}")
    public Result getArticleDetail(@PathVariable("articleId") String articleId) {
        if (StringUtils.isEmpty(articleId)) {
            return Result.fail().message("文章ID不能为空");
        }
        return articleService.getByArticleId(articleId);
    }


    /**
     * 获取文章列表
     * 权限：所有用户
     * 状态：必须为已发布，置顶的由另外一个接口获取，其他的不可能从此接口获取
     *
     * @return
     */
    @ApiOperation("获取文章列表")
    @GetMapping("/list/{page}/{size}")
    public Result listArticle(@PathVariable("page") int page, @PathVariable("size") int size, ArticleQuery query) {
        Page<Article> pageParam = new Page<>(page, size);
        IPage<Article> pageModel = articleService.selectPage(pageParam, query);
        return Result.ok(pageModel);
    }


    /**
     * 根据文章ID获取文章列表
     * 跟上面用同一方法，不同的是，这里要必须给出分类ID条件
     *
     * @param page
     * @param size
     * @param query
     * @return
     */
    @ApiOperation("根据分类ID获取文章列表")
    @GetMapping("/list/category/{page}/{size}")
    public Result listArticleByCategoryId(@PathVariable("page") int page, @PathVariable("size") int size, ArticleQuery query) {
        Page<Article> pageParam = new Page<>(page, size);
        IPage<Article> pageModel = articleService.selectPage(pageParam, query);
        return Result.ok(pageModel);
    }


    /**
     * 获取置顶文章
     * 跟权限无关
     * 状态必须是置顶
     *
     * @return
     */
    @ApiOperation("获取置顶文章")
    @GetMapping("/top")
    public Result getRecommendArticle() {
        List<Article> list = articleService.list(new LambdaQueryWrapper<Article>().eq(Article::getState, Constants.Article.STATE_TOP));
        return Result.ok(list);
    }


    /**
     * 文章推荐
     * 通过标签来计算匹配度
     * 标签：有一个，或者多个，5个以内，包括5个
     * 从里面随机拿一个标签出来 一一》 每一次获取的推荐文章，不那么雷同，总一样就雷同了
     * 通过标签去查询类似的文章，所包含此标签的文章，如果没有相关文章，则从数据中获取最新的文章
     *
     * @param articleId
     * @return
     */
    @ApiOperation("文章推荐")
    @GetMapping("/recommend/{articleId}/{size}")
    public Result getRecommendArticle(@PathVariable("articleId") String articleId, @PathVariable("size") int size) {
        return articleService.listRecommendArticle(articleId, size);
    }


    /**
     * 根据标签查询分页文章列表
     * 与其它分页方法共用同一个方法，不同的是，这里只传 label
     *
     * @param page
     * @param size
     * @param query
     * @return
     */
    @ApiOperation("根据标签获取分页列表")
    @GetMapping("/list/label/{page}/{size}")
    public Result listArticleByLabel(@PathVariable("page") int page, @PathVariable("size") int size, ArticleQuery query) {
        Page<Article> pageParam = new Page<>(page, size);
        IPage<Article> pageModel = articleService.selectPage(pageParam, query);
        return Result.ok(pageModel);
    }



    /**
     * 删除
     *
     * @param articleId
     * @return
     */
    @DeleteMapping("/{articleId}")
    public Result deleteArticle(@PathVariable("articleId") String articleId) {
        return null;
    }


    /**
     * 编辑
     *
     * @param articleId
     * @return
     */
    @PutMapping("/{articleId}")
    public Result updateArticle(@PathVariable("articleId") String articleId) {
        return null;
    }


    /**
     * 更新状态
     *
     * @return
     */
    @PutMapping("/sate/{articleId}/{state}")
    public Result updateArticleState(@PathVariable("articleId") String articleId, @PathVariable("state") String state) {
        return null;
    }


}

